home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / delicious_bookmarks-2.0.64-fx.xpi / chrome / deliciousBookmarks.jar / content / toolbar.js < prev    next >
Encoding:
Text File  |  2008-06-19  |  36.6 KB  |  990 lines

  1. /*
  2.  * requires menubarutils.js ybookmarksOverlay.js
  3.  *
  4.  */
  5. const YB_STRINGS_BOOKMARKS = "yb-strings-bookmarks";
  6. const KEY_YB_TOOLBAR_SELECTION = "extensions.ybookmarks@yahoo.toolbar.tags.selected";
  7. const KEY_YB_TOOLBAR_VIEW = "extensions.ybookmarks@yahoo.toolbar.view";
  8.  
  9. const YB_ENABLE_BUNDLES_VIEW = true;
  10.  
  11. var YB_TOOLBAR_MENULIST_MAX_TAGS = 20;
  12. var YB_TOOLBAR_MAX_BOOKMARKS = 100;
  13.  
  14. var TAG_RECENTLYBOOKMARKED = "system:bookmonkey:recentlybookmarked";
  15. var TAG_MOSTVISITED = "system:bookmonkey:mostvisited";
  16.  
  17. var TOOLBAR_DEFAULT_TAG = TAG_RECENTLYBOOKMARKED;
  18.  
  19. var TOOLBAR_VIEW_BOOKMARKS = 0;
  20. var TOOLBAR_VIEW_TAGS = 1;
  21. var TOOLBAR_VIEW_BUNDLES = 2;
  22. var TOOLBAR_VIEW_DEFAULT = TOOLBAR_VIEW_BOOKMARKS;
  23.  
  24. var ybToolbar = {
  25.   prefs: null,
  26.   _bookmarkRdfObserver: null,
  27.   _datasource : null,
  28.   _currentView: null,
  29.   _platform: null,
  30.   
  31.   onLoad: function() {
  32.     try {
  33.     /* don't do anything if the toolbar is not visible */
  34.       if (!window.toolbar.visible && !window.locationbar.visible) {
  35.         return;
  36.       }
  37.   
  38.     var selectionButton = document.getElementById("ybToolbar-selection");
  39.   
  40.     /* check to see if we're actually in the proper window (i.e, not error console, preferences, etc) */
  41.     if (!selectionButton) {
  42.       return;
  43.     }
  44.     
  45.     window.addEventListener("unload", function() { ybToolbar.onUnload(); }, false);
  46.     
  47.     this._platform = ybookmarksUtils.getPlatform();
  48.     if (this._platform == YB_PLATFORM_MAC) {
  49.       selectionButton.setAttribute("mac", true);
  50.     }
  51.     
  52.     // window resize listener
  53.     document.getElementById( "main-window" ).addEventListener( "resize",  ybToolbar.windowResizeHandler, false );
  54.     
  55.     // prefs
  56.     this.prefs = Components.classes["@mozilla.org/preferences-service;1"].
  57.                       getService(Components.interfaces.nsIPrefBranch);
  58.  
  59.     /* toolbar */
  60.     var selection = document.getElementById("ybToolbar-selection");
  61.     var selectedTag;
  62.     switch (this.prefs.getPrefType(KEY_YB_TOOLBAR_SELECTION)) {
  63.       case Components.interfaces.nsIPrefBranch.PREF_INT:
  64.         this.prefs.clearUserPref(KEY_YB_TOOLBAR_SELECTION);
  65.         yDebug.print("resetting pref " + KEY_YB_TOOLBAR_SELECTION);
  66.       case Components.interfaces.nsIPrefBranch.PREF_INVALID:
  67.         selectedTag = TOOLBAR_DEFAULT_TAG;
  68.         yDebug.print("setting pref " + KEY_YB_TOOLBAR_SELECTION + ": " + selectedTag);
  69.         break;
  70.         
  71.       case Components.interfaces.nsIPrefBranch.PREF_STRING:
  72.         selectedTag = ybookmarksUtils.getUnicodePref(KEY_YB_TOOLBAR_SELECTION, this.prefs);
  73.         yDebug.print(KEY_YB_TOOLBAR_SELECTION + ": " + selectedTag);
  74.       
  75.         break;
  76.     }
  77.     if (!selectedTag) {
  78.       selectedTag = TOOLBAR_DEFAULT_TAG;
  79.     }
  80.     yDebug.print("ybToolbar.onLoad: selectedTag=" + selectedTag);
  81.     selection.setAttribute("value", selectedTag);
  82.     this.reconstructMenuList();
  83.  
  84. //    this.refreshBookmarksView(selectedTag);
  85.     //selection.label = selectedTag;
  86.  
  87.     /* observer for datasource and sync changes */
  88.     this._bookmarkRdfObserver = {
  89.       _ybToolbar: this,
  90.       _shouldUpdateToolbar : false,
  91.       _syncing : false,
  92.       
  93.       _updateToolbar : function () {
  94.         
  95.         //fixed scope problem
  96.         if (this != ybToolbar._bookmarkRdfObserver) {
  97.           ybToolbar._bookmarkRdfObserver._updateToolbar();  
  98.         }
  99.                 
  100.         if (this._shouldUpdateToolbar) {
  101.   
  102.           if (this._syncing) {
  103.             setTimeout(this._updateToolbar, 2000);          
  104.             return;
  105.           }
  106.  
  107.           this._shouldUpdateToolbar = false;
  108.           if (ybToolbar._currentView == TOOLBAR_VIEW_BOOKMARKS) {
  109.             ybToolbar.refreshBookmarksView();
  110.           } else if (ybToolbar._currentView == TOOLBAR_VIEW_BUNDLES) {
  111.             ybToolbar.refreshBundlesView();
  112.           }
  113.         }
  114.       },
  115.       
  116.       observe: function ( aSubject, aTopic, aData ) {
  117.             if ( aTopic == "ybookmark.syncBegin" ) {
  118.               this._syncing = true;
  119.               
  120.             } else if ( aTopic == "ybookmark.syncDone" ) {
  121.                 this._syncing = false;
  122.               
  123.                if ( aData == "all-done" || aData == "remove-bookmarks" || aData == "remove-extra") {
  124.                  this._shouldUpdateToolbar = true;                    
  125.                  setTimeout(this._updateToolbar, 0);            
  126.               } 
  127.             } else if ( aTopic == "ybookmark.syncInfo" ) {
  128.               if ( aData =="more-chunk" ) {
  129.                   // probably wait for whole update to finish
  130.               } else if (aData == "add-to-ds-end") {
  131.                  this._shouldUpdateToolbar = true;                    
  132.                  setTimeout(this._updateToolbar, 0);
  133.               }
  134.             }
  135.       },
  136.       
  137.       onAssert: function(aDatasource, aSource, aPredicate, aTarget) {        
  138.     
  139.         if (this._syncing && this._shouldUpdateToolbar) {
  140.           return;
  141.         }
  142.         
  143.         //do it when a tag is added to a bookmark
  144.         if ( aPredicate.EqualsNode( gYBrscTag ) ) {
  145.                    
  146.           var tags = this._ybToolbar.getSelectedType();
  147.           if (tags.length) {
  148.             if (tags == TAG_RECENTLYBOOKMARKED || tags == TAG_MOSTVISITED) {
  149.               this._shouldUpdateToolbar = true;
  150.               setTimeout(this._updateToolbar, 0);
  151.             }
  152.             else {
  153.               var mTags = aDatasource.GetTargets(aSource, gYBrscTag, true);
  154.               while ( mTags.hasMoreElements() ) {
  155.                 mTag = (mTags.getNext().QueryInterface(Components.interfaces.nsIRDFLiteral).Value).toLowerCase();
  156.                 if (tags == mTag) {
  157.                   this._shouldUpdateToolbar = true;                    
  158.                   setTimeout(this._updateToolbar, 0);
  159.                  break;
  160.                 }
  161.               }
  162.             }
  163.           }
  164.         } else if (aSource.EqualsNode(gYBrscBundleRoot) && aPredicate.EqualsNode( gYBrscBundle )) {
  165.           this._shouldUpdateToolbar = true;                    
  166.           setTimeout(this._updateToolbar, 0);
  167.         } 
  168.       },
  169.  
  170.       onBeginUpdateBatch: function(aDatasource) {
  171.       },
  172.  
  173.       onChange: function(aDatasource, aSource, aPredicate, aOldTarget, aNewTarget ) { 
  174.         if (this._syncing && this._shouldUpdateToolbar) {
  175.           return;
  176.         }
  177.       
  178.         if (aPredicate.EqualsNode(gYBrscVisitCount) || aPredicate.EqualsNode(gYBrscLastVisitDate)) {
  179.           var tags = this._ybToolbar.getSelectedType();
  180.           if (tags.length) {
  181.             if (tags == TAG_RECENTLYBOOKMARKED && aPredicate.EqualsNode(gYBrscLastVisitDate)) {
  182.               this._shouldUpdateToolbar = true;
  183.               setTimeout(this._updateToolbar, 0);
  184.             }
  185.             else if (tags == TAG_MOSTVISITED && aPredicate.EqualsNode(gYBrscVisitCount)) {
  186.               this._shouldUpdateToolbar = true;              
  187.               setTimeout(this._updateToolbar, 0);
  188.             }
  189.           }        
  190.         }
  191.       
  192.       },
  193.  
  194.       onEndUpdateBatch: function(aDatasource) { 
  195.       },
  196.  
  197.       onMove: function(aDatasource, aOldSource, aNewSource, aPredicate, aTarget) { 
  198.       },
  199.  
  200.       onUnassert: function(aDatasource, aSource, aPredicate, aTarget) { 
  201.     
  202.         if (this._syncing && this._shouldUpdateToolbar) {
  203.         return;
  204.         }
  205.  
  206.         //the event is fired several times for the same url
  207.         //so we use timeout to execute the update once
  208.         if (aPredicate.EqualsNode(gYBrscUrl)) {
  209.  
  210.           var tags = this._ybToolbar.getSelectedType();
  211.           if (tags.length) {
  212.             if (tags == TAG_RECENTLYBOOKMARKED || tags == TAG_MOSTVISITED) {
  213.              this._shouldUpdateToolbar = true;
  214.               setTimeout(this._updateToolbar, 0);
  215.             }
  216.             else {
  217.               var mTags = aDatasource.GetTargets(aSource, gYBrscTag, true);
  218.               while ( mTags.hasMoreElements() ) {
  219.                 mTag = (mTags.getNext().QueryInterface(Components.interfaces.nsIRDFLiteral).Value).toLowerCase();
  220.                 if (tags == mTag) {
  221.                   this._shouldUpdateToolbar = true;                  
  222.                   setTimeout(this._updateToolbar, 0);
  223.                 break;
  224.                 }
  225.               }
  226.             }
  227.           }
  228.         } 
  229.       }
  230.     };
  231.     
  232.     //add observer for sync
  233.     var os = Components.classes["@mozilla.org/observer-service;1"]
  234.                                      .getService(Components.interfaces.nsIObserverService);
  235.     os.addObserver ( this._bookmarkRdfObserver, "ybookmark.syncBegin", false );
  236.     os.addObserver ( this._bookmarkRdfObserver, "ybookmark.syncInfo", false );
  237.     os.addObserver ( this._bookmarkRdfObserver, "ybookmark.syncDone", false );    
  238.     
  239.     //add observer for datasource
  240.     var bookmarksStoreService = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  241.           getService( Components.interfaces.nsIYBookmarksStoreService );
  242.     this._datasource = bookmarksStoreService.getDataSource();
  243.     this._datasource.AddObserver( this._bookmarkRdfObserver );  
  244.  
  245.     //this.refreshBookmarksView();
  246.     
  247.     //check for selected view
  248.     var selectedView = this.prefs.getIntPref(KEY_YB_TOOLBAR_VIEW);
  249.   
  250.     
  251.   /*  var selectedViewItem;
  252.     var selectedViewItemOptions;    
  253.     if (selectedView == TOOLBAR_VIEW_BOOKMARKS) {
  254.           selectedViewItem = document.getElementById("ybToolbar-context-menu-view-bookmarks");
  255.           selectedViewItemOptions = document.getElementById("ybToolbar-options-view-bookmarks");
  256.       } else {
  257.           selectedViewItem = document.getElementById("ybToolbar-context-menu-view-tags");
  258.           selectedViewItemOptions = document.getElementById("ybToolbar-options-view-tags");
  259.       }
  260.       selectedViewItem.setAttribute("checked", true);
  261.       selectedViewItemOptions.setAttribute("checked", true);
  262.       */
  263.     setTimeout(function(selectedView) {ybToolbar.setView(selectedView);}, 100, selectedView);
  264.     
  265.     // bundles related
  266.     
  267.         
  268.     if (!YB_ENABLE_BUNDLES_VIEW) {
  269.       document.getElementById("yb-broadcaster-bundlesview-menuitem").setAttribute("hidden", true);
  270.     }       
  271.     } catch(e) {
  272.       yDebug.print("ybToolbar.onLoad: " + e, YB_LOG_MESSAGE);
  273.     }
  274.   },
  275.   
  276.   
  277.   onUnload: function() {
  278.     
  279.     try {
  280.       this._datasource.RemoveObserver( this._bookmarkRdfObserver );
  281.     } catch ( e ) { }
  282.     
  283.     var os = Components.classes["@mozilla.org/observer-service;1"]
  284.                                      .getService(Components.interfaces.nsIObserverService);
  285.     try {
  286.       os.removeObserver ( this._bookmarkRdfObserver, "ybookmark.syncDone" );
  287.       os.removeObserver ( this._bookmarkRdfObserver, "ybookmark.syncInfo" );
  288.       os.removeObserver ( this._bookmarkRdfObserver, "ybookmark.syncBegin" );
  289.     }
  290.     catch(e){ }
  291.   },
  292.   
  293.   firstTimeStart: function() {
  294.     this.reconstructMenuList();    
  295.   },
  296.   
  297.   setView: function(aView) {
  298.     var tagsView = document.getElementById("ybToolbar-tagsview");
  299.     var bookmarksView = document.getElementById("ybToolbar-bookmarksview");
  300.     var bundlesView = document.getElementById("ybToolbar-bundlesview");
  301.     this._currentView = aView;
  302.       
  303.     var bookmarksItem = document.getElementById("yb-broadcaster-bookmarksview-menuitem");
  304.     var tagsItem = document.getElementById("yb-broadcaster-tagsview-menuitem");
  305.     var bundlesItem = document.getElementById("yb-broadcaster-bundlesview-menuitem");
  306.     
  307.     if (aView == TOOLBAR_VIEW_BOOKMARKS) {
  308.       tagsView.hidden = true;
  309.           bookmarksView.hidden = false;
  310.           bundlesView.hidden = true;
  311.           this.refreshBookmarksView();
  312.           bookmarksItem.setAttribute("checked", true);
  313.           tagsItem.setAttribute("checked", false);
  314.           bundlesItem.setAttribute("checked", false);
  315.  
  316.       } else if (aView == TOOLBAR_VIEW_TAGS) {
  317.         tagsView.hidden = false;
  318.         bookmarksView.hidden = true;
  319.           bundlesView.hidden = true;
  320.         this.refreshTagsView();
  321.           bookmarksItem.setAttribute("checked", false);
  322.           tagsItem.setAttribute("checked", true);
  323.           bundlesItem.setAttribute("checked", false);
  324.  
  325.       } else if (aView == TOOLBAR_VIEW_BUNDLES) {
  326.         tagsView.hidden = true;
  327.         bookmarksView.hidden = true;
  328.         bundlesView.hidden = false;
  329.         this.refreshBundlesView();
  330.       bookmarksItem.setAttribute("checked", false);
  331.           tagsItem.setAttribute("checked", false);
  332.           bundlesItem.setAttribute("checked", true);
  333.  
  334.       } else {
  335.           return;
  336.       }
  337.  
  338.     this.prefs.setIntPref(KEY_YB_TOOLBAR_VIEW, aView);
  339.   },
  340.   
  341.   currentViewButtons: function() {
  342.     var buttons;
  343.     if (this._currentView == TOOLBAR_VIEW_BOOKMARKS) {
  344.       buttons = document.getElementById("ybToolbar-bookmarksview-bookmarks");
  345.     } else if (this._currentView == TOOLBAR_VIEW_TAGS) {
  346.       buttons = document.getElementById("ybToolbar-tagsview-tags");
  347.     } else if (this._currentView == TOOLBAR_VIEW_BUNDLES) {
  348.       buttons = document.getElementById("ybToolbar-bundlesview-bundles");
  349.     }
  350.     return buttons;
  351.   },
  352.   
  353.   /*** menu list ***/
  354.   reconstructMenuList: function() {
  355.     yDebug.print("reconstructing Menulist");
  356.     this.addTagsToMenuList();
  357.     
  358.     var button = document.getElementById("ybToolbar-selection");
  359.     var selectedTag =  button.getAttribute("value");
  360.     
  361.     if (selectedTag != TAG_RECENTLYBOOKMARKED && selectedTag != TAG_MOSTVISITED) {
  362.       var tags = ybBags.getFavoriteTags();
  363.       var selectedTagExists = false;
  364.       for (var tagIndex = 0; tagIndex < tags.length && tagIndex < YB_TOOLBAR_MENULIST_MAX_TAGS; ++tagIndex) {
  365.         if (selectedTag == tags[tagIndex]) {
  366.           selectedTagExists = true;
  367.           break;
  368.         }
  369.       }
  370.     
  371.       if (!selectedTagExists) {
  372.         button.setAttribute("label", ybookmarksMain.strings.getString("extensions.ybookmarks.recently.bookmarked"));
  373.         button.setAttribute("value", TAG_RECENTLYBOOKMARKED);
  374.         button.setAttribute("class", "yb-tag-item-reserved");
  375.         this.refreshBookmarksView();
  376.       }
  377.     }
  378.   },
  379.   
  380.   
  381.   addTagsToMenuList: function() {  
  382.       var tags = ybBags.getFavoriteTags();
  383.       var menu = document.getElementById("ybToolbar-selection-popup");
  384.       var start = document.getElementById("ybToolbar-selection-tags-start");
  385.       var end = document.getElementById("ybToolbar-selection-tags-end");
  386.       
  387.       this._exciseMenuDestructive(menu, start, end);
  388.       
  389.       // add the tags
  390.       for (var tagIndex = 0; tagIndex < tags.length && tagIndex < YB_TOOLBAR_MENULIST_MAX_TAGS; ++tagIndex) {
  391.         var tagName = tags[tagIndex];
  392.         var tagItem = ybookmark_Utils.createMenuItem(tagName, "", "", "");  
  393.         tagItem.removeAttribute("command");
  394.         tagItem.setAttribute("oncommand", "ybToolbar.refreshBookmarksView(event.target.value);");
  395.         tagItem.setAttribute("value", tagName);
  396.         tagItem.setAttribute("class", "menuitem-iconic yb-tag-item");
  397.         menu.insertBefore(tagItem, end);
  398.       }
  399.       
  400.       if (tags.length > 0) {
  401.         end.hidden = true;
  402.       } else {
  403.         end.hidden = false;
  404.       }
  405.   },
  406.   
  407.   
  408.   /**
  409.     * Remove from parent the childNodes in-between start and end, non-inclusive
  410.     * Note: this modifies parent
  411.     */
  412.   _exciseMenuDestructive: function(parent, start, end) {
  413.     var start_i = -1;
  414.     for(var i=0; i < parent.childNodes.length; i++) {
  415.         if (parent.childNodes[i] == start) { 
  416.           start_i = i;
  417.           break; 
  418.         } 
  419.     }
  420.     if (start_i >= 0) {
  421.       var child = parent.childNodes[start_i+1]; // for some reason, a for loop doesn't work... early binding?
  422.       while (child != end) { 
  423.          parent.removeChild (child);
  424.          child = parent.childNodes[start_i+1];
  425.       }
  426.       
  427.     }
  428.     
  429.   },
  430.   
  431.   _createToolbarButton: function(aView, aItem) {
  432.         var btn = document.createElementNS(gYBXUL_NS, "toolbarbutton");
  433.         btn.setAttribute("label", aItem.name);  
  434.         
  435.         if (aView == TOOLBAR_VIEW_BOOKMARKS) {
  436.           btn.setAttribute("url", aItem.url );
  437.           btn.setAttribute("image", aItem.icon);
  438.         btn.setAttribute("class", "bookmark-item");
  439.         btn.setAttribute("context", "yb-bookmarks-context-menu");
  440.     
  441.           if (aItem.type == YB_TYPE_LIVEMARK) {
  442.             btn.setAttribute("livemark", true);
  443.             btn.setAttribute("container", true);
  444.             btn.setAttribute("type", "menu");
  445.             var popup = document.createElementNS(gYBXUL_NS, "menupopup");
  446.             popup.setAttribute("onpopupshowing", "if (event.target == this) { ybBookmarksMenu.createLivemarkMenu(event.target); }");
  447.             popup.setAttribute("onpopuphiding", "if (event.target == this) { ybBookmarksMenu.destroyLivemarkMenu(event); }");
  448.           btn.setAttribute("order", aItem.order );
  449.             btn.appendChild(popup);
  450.       
  451.           } else {
  452.             btn.setAttribute("oncommand", "if (event.target == this) { ybookmarksUtils.openBookmark(event);}");
  453.             btn.setAttribute("onclick", "if (event.target == this && event.button == 1) { ybookmarksUtils.openBookmark(event); }");
  454.             btn.setAttribute("tooltip", "ybToolbar-tooltip");
  455.             btn.setAttribute("type", aItem.type);
  456.             btn.setAttribute("statustext", aItem.url);
  457.           }
  458.     
  459.         } else if (aView == TOOLBAR_VIEW_TAGS) {
  460.             btn.setAttribute("context", "yb-tags-context-menu");
  461.   
  462.             btn.setAttribute("container", true);
  463.             btn.setAttribute("class", "yb-tag-item");          
  464.             btn.setAttribute("type", "menu");
  465.             var popup = document.createElementNS(gYBXUL_NS, "menupopup");
  466.             popup.setAttribute("onpopupshowing", "if (event.target == this) { ybBookmarksMenu.createTagMenu(event.target); }");
  467.             popup.setAttribute("onpopuphiding", "if (event.target == this) { ybBookmarksMenu.destroyTagMenu(event); }");
  468.           
  469.             btn.appendChild(popup);      
  470.     
  471.         } else if (aView == TOOLBAR_VIEW_BUNDLES) {
  472.             btn.setAttribute("container", true);
  473.             btn.setAttribute("class", "yb-bundle-item");          
  474.             btn.setAttribute("type", "menu");
  475.             
  476.             var popup = document.createElementNS(gYBXUL_NS, "menupopup");
  477.             popup.setAttribute("onpopupshowing", "if (event.target == this) { ybBookmarksMenu.createBundleMenu(event.target); }");
  478.             popup.setAttribute("onpopuphiding", "if (event.target == this) { ybBookmarksMenu.destroyBundleMenu(event); }");
  479.                 btn.appendChild(popup);      
  480.             }
  481.       
  482.       if (aItem.order) {
  483.         btn.setAttribute("order", aItem.order);  
  484.       }
  485.       if (aItem.favoriteTag) {
  486.         btn.setAttribute("favoriteTag", aItem.favoriteTag);  
  487.       }
  488. /* ******* leaving this checked in, as it can be turned on quickly *******
  489.     if( aItem.shared == "false" ) {
  490.       btn.setAttribute( "class", btn.getAttribute( "class" ) + " private-bookmark" );
  491.     }
  492. */
  493.     return btn;
  494.   },
  495.   
  496.   _getSelectedTag: function() {
  497.     var button = document.getElementById("ybToolbar-selection");
  498.     return button.getAttribute("value")
  499.   },
  500.   
  501.   
  502.   /*** Event handlers ***/
  503.  
  504.   refreshCurrentView: function() {
  505.    if (this._currentView == TOOLBAR_VIEW_BOOKMARKS) {
  506.      this.refreshBookmarksView();
  507.    } else if (this._currentView == TOOLBAR_VIEW_TAGS) {
  508.        this.refreshTagsView();
  509.    } else if (this._currentView == TOOLBAR_VIEW_BUNDLES) {
  510.      this.refreshBundlesView();
  511.    }
  512.   },
  513.    
  514.   /**
  515.    * refreshes the Bookmarks view - populates the toolbar with the appropriate bookmarks
  516.    * @param aTag optional tag to indicate selected tag. null means to refresh the view with the currently selected tag. 
  517.    */
  518.   refreshBookmarksView: function(aTag) {
  519.     try {
  520.     var button = document.getElementById("ybToolbar-selection");
  521.     var selectedTags;
  522.     
  523.     if (aTag) {
  524.       selectedTags = aTag;
  525.     } else {
  526.       selectedTags =  button.getAttribute("value");
  527.     }
  528.     var bookmarks;  
  529.     var label;
  530.     //var order = FAVTAGS_ORDER_DEFAULT;
  531.     yDebug.print("Selected tags: " + selectedTags);
  532.     if (selectedTags == TAG_MOSTVISITED) {
  533.       bookmarks = ybookmark_Utils.getFrequentBookmarks(YB_TOOLBAR_MAX_BOOKMARKS);
  534.       label = ybookmarksMain.strings.getString("extensions.ybookmarks.most.visited");
  535.       button.setAttribute("class", "yb-tag-item-reserved");
  536.       
  537.     } else if (selectedTags == TAG_RECENTLYBOOKMARKED) {
  538.       bookmarks = ybookmark_Utils.getRecentlySavedBookmarks(YB_TOOLBAR_MAX_BOOKMARKS);
  539.       label = ybookmarksMain.strings.getString("extensions.ybookmarks.recently.bookmarked");
  540.       button.setAttribute("class", "yb-tag-item-reserved");
  541.     
  542.     } else if (selectedTags == "") {
  543.       label = "";
  544.       bookmarks = [];
  545.     } else {
  546.       var order = ybBags.getFavoriteTagOrder(selectedTags);  
  547.       bookmarks = ybBags.getBookmarksFromFavoriteTag(selectedTags, order);
  548.       label = selectedTags;
  549.       button.setAttribute("class", "yb-tag-item");
  550.     
  551.     }
  552.     button.setAttribute("label", label);
  553.     button.setAttribute("value", selectedTags);
  554.     //document.getElementById("ybToolbar-bookmarksview").setAttribute("order", order);
  555.     
  556.     if (bookmarks) {
  557.       this._populateBookmarksView(bookmarks);     
  558.     }
  559.     if (aTag) {
  560.       ybookmarksUtils.setUnicodePref(KEY_YB_TOOLBAR_SELECTION, aTag, this.prefs);
  561.     }
  562.     } catch (e) {
  563.       yDebug.print("ybToolbar.refreshBookmarksView(" + aTag + "): error: " + e, YB_LOG_MESSAGE);
  564.     } 
  565.   },
  566.   
  567.     refreshTagsView: function () {
  568.       var tags = ybBags.getFavoriteTags();
  569.       
  570.       var tagsArg = tags.map(function(tag) { 
  571.                                     return {name: tag,
  572.                                             url: "",
  573.                                             icon: "",
  574.                                             type: YB_TYPE_TAG,
  575.                                             order: ybBags.getFavoriteTagOrder(tag),
  576.                                             favoriteTag: true};
  577.                                  });
  578.       this._populateTagsView(tagsArg);
  579.     },
  580.     
  581.     refreshBundlesView: function() {
  582.       try {
  583.       var bundles = ybookmarksMain.gBookmarks.getBundles({});
  584.       bundles = bundles.map(function(b) { return { name: b.name,
  585.                                                    type: YB_TYPE_BUNDLE,
  586.                                                    order: b.order }; });
  587.                                                      
  588.       this._populateBundlesView(bundles);
  589.     } catch (e) { yDebug.print("refreshBundlesView: " + e);}
  590.     },
  591.     
  592.     _populateBookmarksView: function(bookmarks) {
  593.       this._populateView(TOOLBAR_VIEW_BOOKMARKS, bookmarks);
  594.     },
  595.  
  596.     _populateTagsView: function(tags) {
  597.       this._populateView(TOOLBAR_VIEW_TAGS, tags);
  598.     },
  599.     
  600.     _populateBundlesView: function(bundles) {
  601.       this._populateView(TOOLBAR_VIEW_BUNDLES, bundles);
  602.     },
  603.     
  604.     _populateView: function(aView, aItems) {
  605.       try {
  606.       var buttons;
  607.       var order;
  608.       if (aView == TOOLBAR_VIEW_BOOKMARKS) {
  609.         buttons = document.getElementById("ybToolbar-bookmarksview-bookmarks");
  610.         order = ybBags.getFavoriteTagOrder(this._getSelectedTag());
  611.       } else if (aView == TOOLBAR_VIEW_TAGS) {
  612.         buttons = document.getElementById("ybToolbar-tagsview-tags");
  613.       } else if (aView == TOOLBAR_VIEW_BUNDLES) {
  614.         buttons = document.getElementById("ybToolbar-bundlesview-bundles");
  615.       } else {
  616.         return;
  617.       }
  618.       var menu = document.getElementById ( "ybToolbar-chevron" ).firstChild;
  619.       
  620.       // clear buttons and menu
  621.       while (buttons.childNodes.length > 0) {
  622.           buttons.removeChild(buttons.lastChild);
  623.       }
  624.       while (menu.childNodes.length > 0) {
  625.           menu.removeChild(menu.lastChild);
  626.       }
  627.       var numItems = aItems.length < YB_TOOLBAR_MAX_BOOKMARKS ? aItems.length : YB_TOOLBAR_MAX_BOOKMARKS; 
  628.       for (var i=0; i < numItems; i++) {
  629.         var item = aItems[i];
  630.         if (item.type == YB_TYPE_LIVEMARK) {
  631.           var newItem = {};
  632.           for (var prop in item) {
  633.             newItem[prop] = item[prop];
  634.           }
  635.           newItem.order = FAVTAGS_ORDER_USER;
  636.           item = newItem;
  637.         }
  638.         var button = this._createToolbarButton(aView, item);
  639.         button.setAttribute("collapsed", true);
  640.         buttons.appendChild(button);        
  641.  
  642.         var menuItem = ybBookmarksMenu.createMenuItem(item);
  643.         menuItem.setAttribute("hidden", true);
  644.         menu.appendChild(menuItem);
  645.       }
  646.       this.redrawLayout();
  647.     } catch (e) {
  648.         yDebug.print("ybToolbar._populateView(" + aView + ", ... ): error: " + e.stack, YB_LOG_MESSAGE);
  649.     }
  650.   },
  651.   
  652.   openToolbarOptions: function() {
  653.     setTimeout( "ybToolbar._focusTabPanel()", 100 );
  654.     openPreferences( "paneBookmarks" );
  655.   },
  656.  
  657.   _focusTabPanel: function() {
  658.     var wm = Components.classes[ "@mozilla.org/appshell/window-mediator;1" ]
  659.                             .getService( Components.interfaces.nsIWindowMediator );
  660.     var ref = wm.getMostRecentWindow( null );
  661.     if( ref ) {
  662.       var box, panel, tab;
  663.       box = ref.window.document.getElementById( "bookmarksPrefs" );
  664.       tab = ref.window.document.getElementById( "tab_yb_bags" );
  665.       panel = ref.window.document.getElementById( "tbp_yb_bags" );
  666.       if( ( box != null ) && ( panel != null ) && ( tab != null ) ) {
  667.         box.selectedTab = tab;
  668.         box.selectedPanel = panel;
  669.       }
  670.     }
  671.   },
  672.  
  673.   /*_stopBubble: function(event) {
  674.     try {
  675.       var stopItems = [ "ybToolbar-selection-tagstoolbar-editor", 
  676.                         "ybToolbar-selection-options" 
  677.                       ];
  678.       var stopFuncs = [ function() { ybToolbar.openTagsToolbarEditor(); }, 
  679.                         function() { ybToolbar.openToolbarOptions(); } 
  680.                       ];      
  681.       
  682.       var stop = false;
  683.       var func;
  684.       for (var i = 0; i < stopItems.length; i++) {
  685.         if (event.target.id == stopItems[i]) {
  686.           stop = true;
  687.           func = stopFuncs[i];
  688.           break;
  689.         }
  690.       }    
  691.       
  692.       if (stop) {
  693.         if (func != null) {
  694.             func.call();
  695.         }
  696.         event.preventBubble();
  697.       }
  698.   } catch (e) {
  699.     alert(e);
  700.   }
  701.     
  702.   },*/
  703.   
  704.   openURLIn: function(event, where) {
  705.     switch (where) {
  706.       case "current":
  707.       case "window":
  708.       case "tab":
  709.         event.target.setAttribute("type", YB_TYPE_BOOKMARK);
  710.         event.target.setAttribute("url", document.popupNode.getAttribute("url"));   
  711.         ybookmarksUtils.openBookmark(event, where);
  712.       break;
  713.     }
  714.  
  715.   },
  716.  
  717.   openTag: function (aMenu, aEvent) {
  718.     var tag = aMenu.parentNode.getAttribute("label");
  719.     ybookmarksUtils.openTag(tag, aEvent);
  720.   },
  721.  
  722.   openBookmarkContainer: function (aMenu) {
  723.         var livemark = aMenu.parentNode.getAttribute("livemark");
  724.         if (livemark) {
  725.           ybBookmarksMenu.createLivemarkMenu(aMenu);
  726.         } else {
  727.           ybBookmarksMenu.createTagMenu(aMenu);
  728.         }
  729.         YBtabsOpener.open(aMenu);    
  730.   },
  731.   
  732.   moreAbout: function(event) {
  733.      event.target.setAttribute("type", YB_TYPE_BOOKMARK);
  734.      event.target.setAttribute("url", deliciousService.getMoreAboutUrl(
  735.         document.popupNode.getAttribute("url")));
  736.      ybookmarksUtils.openBookmark(event, "current");
  737.   },
  738.      
  739.    openTagsToolbarEditor : function() {
  740.       var win = window.openDialog( "chrome://ybookmarks/content/tagsToolbarEditor.xul",
  741.                     "",
  742.                     "chrome,centerscreen,modal,dialog=no,resizable=yes",
  743.                     { _ybToolbar: this,
  744.                       onUpdate: function() {  if (this._ybToolbar._currentView == TOOLBAR_VIEW_BOOKMARKS) {
  745.                                                 this._ybToolbar.refreshBookmarksView();
  746.                                               } else if (this._ybToolbar._currentView == TOOLBAR_VIEW_TAGS){
  747.                                                 this._ybToolbar.refreshTagsView();
  748.                                               }
  749.                                               this._ybToolbar.reconstructMenuList();
  750.                                             }
  751.                     });
  752.   },
  753.  
  754.   openBundleEditor : function() {
  755.      var win = window.openDialog( "chrome://ybookmarks/content/bundleEditor.xul",
  756.                    "",
  757.                    "chrome,centerscreen,modal,dialog=no,resizable=yes",
  758.                    { _ybToolbar: this,
  759.                      onUpdate: function() {  if (this._ybToolbar._currentView == TOOLBAR_VIEW_BUNDLES) {
  760.                                                this._ybToolbar.refreshBundlesView();
  761.                                              }
  762.                                            }
  763.                    });
  764.    },
  765.  
  766.   getSelectedType : function() {
  767.     var button = document.getElementById("ybToolbar-selection"); 
  768.     var val = button.getAttribute("value");
  769.     return val ? val : "";
  770.   },
  771.    
  772.    windowResizeHandler: { 
  773.      handleEvent: function (event) {
  774.          ybToolbar.redrawLayout();
  775.      }
  776.    },
  777.  
  778.   /*** dynamic layout ***/
  779.   updateOverflowMenu: function (aMenuPopup)
  780.   {
  781.     var buttons = this.currentViewButtons();//document.getElementById("ybToolbar-bookmarksview-bookmarks");
  782.  
  783.     for (var i = 0; i < buttons.childNodes.length; i++) {
  784.       var button = buttons.childNodes[i];
  785.       var menu = aMenuPopup.childNodes[i];
  786.       if (menu.hidden == button.collapsed)
  787.         menu.hidden = !menu.hidden;
  788.     }
  789.   },
  790.  
  791.   _redrawLayoutEventListener: function(event) {
  792.     ybToolbar.redrawLayout(event);
  793.   },
  794.   
  795.   redrawLayout: function(event) {
  796.     try {
  797.     if (event && event.type == 'focus') { 
  798.       window.removeEventListener('focus', this._redrawLayoutEventListener, false); // hack for bug 266737  
  799.     }
  800.     var buttons = this.currentViewButtons();//document.getElementById("ybToolbar-bookmarksview-bookmarks");
  801.     if (!buttons)
  802.       return;
  803.     var width = window.innerWidth;
  804.     //yDebug.print("THE WIDTH: " + width + " | " + window.outerWidth);
  805.     if (width <= 1) {  // hack for bug 266737
  806.         
  807.       window.addEventListener('focus', this._redrawLayoutEventListener, false);
  808.       return;
  809.     }
  810.     var chevron = document.getElementById("ybToolbar-chevron");
  811.     if (buttons.childNodes.length <= 0) {
  812.       // No bookmarks means no chevron
  813.       chevron.collapsed = true;
  814.       return;
  815.     }
  816.  
  817.     var toolbar = document.getElementById("ybToolbar-options").parentNode.parentNode;
  818.     for (var i = toolbar.childNodes.length-1; i >= 0; i--){
  819.       var anItem = toolbar.childNodes[i];
  820.       if (anItem.id == "ybToolbar-toolbar") {
  821.         break;
  822.       } else if (anItem.id == "urlbar-container") {
  823.         /* we want the minimum width, but I can't seem to be able to access it */
  824.         //alert(anItem.minWidth);
  825.         width -= anItem.boxObject.width;
  826.       } else {
  827.         width -= anItem.boxObject.width;
  828.       }
  829.     }
  830.     
  831.     chevron.collapsed = false;
  832.     var chevronWidth = chevron.boxObject.width;
  833.     chevron.collapsed = true;
  834.     var overflowed = false;
  835.     var isLTR = window.getComputedStyle(document.getElementById("PersonalToolbar"),'').direction=='ltr';
  836.   
  837.     for (var i=0; i<buttons.childNodes.length; i++) {
  838.       var button = buttons.childNodes[i];
  839.       button.collapsed = false;
  840.       var button_x = button.boxObject.x;
  841.       var button_width = button.boxObject.width;
  842.       button.collapsed = overflowed;
  843.       
  844.       if (i == buttons.childNodes.length - 1) {// last item...
  845.         chevronWidth = 0;
  846.       }
  847.       var offset = isLTR ? button_x : width - button_x;
  848.       //yDebug.print("" + offset + " | " + button_width+ " | " + chevronWidth+ " > " + width);
  849.       if (offset + button_width + chevronWidth > width) {
  850.          overflowed = true;
  851.         // This button doesn't fit. Show it in the menu. Hide it in the toolbar.
  852.         if (!button.collapsed) {
  853.           button.collapsed = true;
  854.         }
  855.         if (chevron.collapsed) {
  856.           chevron.collapsed = false;
  857.           var overflowPadder = document.getElementById("ybToolbar-overflow-padder");
  858.         
  859.           offset = isLTR ? button_x : width - buttons.boxObject.x - buttons.boxObject.width;
  860.           overflowPadder.width = width - chevron.boxObject.width - offset;    
  861.         }
  862.       }      
  863.     }
  864.     
  865.   } catch (e) { 
  866.     yDebug.print("redrawLayout(): " + e, YB_LOG_MESSAGE); 
  867.   }
  868.   },
  869.   
  870.   dndObserver: {
  871.   
  872.     getSupportedFlavours : function () {
  873.       var flavourSet = new FlavourSet();
  874.       flavourSet.appendFlavour("moz/rdfitem");
  875.       flavourSet.appendFlavour("text/x-moz-url");
  876.       flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  877.       flavourSet.appendFlavour("text/unicode");
  878.       return flavourSet;
  879.     },
  880.  
  881.     onDragOver: function(event, flavour, session){
  882.       var statusTextField = document.getElementById( "statusbar-display" );
  883.       if ( gNavigatorBundle && statusTextField ) {
  884.         statusTextField.label = gNavigatorBundle.getString( "droponbookmarksbutton" );
  885.       }
  886.       session.dragAction = Components.interfaces.nsIDragService.DRAGDROP_ACTION_LINK;
  887.     },
  888.  
  889.     onDrop: function(event, dropdata, session) {
  890.       if (dropdata.data != "") {
  891.             var data = dropdata.data.split("\n");
  892.             var url = data[0];
  893.             var name = data[1];
  894.             
  895.                var userSelectedTag = null;
  896.                //make sure that tags view is selected
  897.                var tagsView = document.getElementById("ybToolbar-tagsview");               
  898.             if (tagsView.hidden == false) {
  899.                 userSelectedTag = event.target.getAttribute("label");
  900.             } else { 
  901.                 //bookmarks view
  902.                 var bookmarksView = document.getElementById("ybToolbar-bookmarksview");
  903.                 if (bookmarksView.hidden == false) {
  904.                     var button = document.getElementById("ybToolbar-selection");
  905.                     var selectedTag =  button.getAttribute("value");
  906.                     if (selectedTag != TAG_RECENTLYBOOKMARKED && selectedTag != TAG_MOSTVISITED) {
  907.                         userSelectedTag =     selectedTag;
  908.                     }    
  909.                 }       
  910.             }
  911.             yAddBookMark.open(url, name, null, null, null, null, null, null, null, userSelectedTag);
  912.       } 
  913.     },
  914.         
  915.     onDragExit: function( event, session ) {
  916.       var statusTextField = document.getElementById( "statusbar-display" );
  917.       if ( statusTextField )
  918.         statusTextField.label = "";
  919.     }
  920.   },
  921.   
  922.   onEditBundle: function(event, mouseClick) {
  923.     var bundle = event.target.parentNode.parentNode.getAttribute("label");
  924.     event.bundle = bundle;
  925.     ybookmarksMain.loadRelevantPage(event, 'editbundle', mouseClick);
  926.   },
  927.   
  928.   /*** Misc stuff ***/
  929.   // Fill in tooltips for personal toolbar (and Bookmarks menu).
  930.   fillInBTTooltip: function (tipElement) {
  931.  
  932.     var title = tipElement.label;
  933.     var url = tipElement.statusText;
  934.  
  935.     // Don't show a tooltip without any data.
  936.     if (!title && !url)
  937.       return false;
  938.  
  939.     var tooltipElement = document.getElementById("ybToolbar-tooltip-text");
  940.     tooltipElement.hidden = !title || (title == url);
  941.     if (!tooltipElement.hidden)
  942.       tooltipElement.setAttribute("value", title);
  943.  
  944.     tooltipElement = document.getElementById("ybToolbar-tooltip-url");
  945.     tooltipElement.hidden = !url;
  946.     if (!tooltipElement.hidden)
  947.       tooltipElement.setAttribute("value", url);
  948.  
  949.     return true;
  950.   },
  951.     
  952.   /* menu autoopen code ganked from /browser/components/bookmarks/content/bookmarksMenu.js */
  953.   _openedMenuButton:null,
  954.   autoOpenMenu: function (aEvent) {
  955.     var target = aEvent.target;
  956.     if (ybToolbar._openedMenuButton != target && target.nodeName == "toolbarbutton" && target.type == "menu") {
  957.       ybToolbar._openedMenuButton.open = false;
  958.       target.open = true;
  959.     }
  960.   },
  961.  
  962.   setOpenedMenu: function (aEvent) {
  963.     if (aEvent.target.parentNode.localName == 'toolbarbutton') {
  964.       if (!this._openedMenuButton) {
  965.         aEvent.currentTarget.addEventListener("mouseover", this.autoOpenMenu, true);
  966.       }
  967.       this._openedMenuButton = aEvent.target.parentNode;
  968.     }
  969.   },
  970.  
  971.   unsetOpenedMenu: function (aEvent) {
  972.     if (aEvent.target.parentNode.localName == 'toolbarbutton') {
  973.       aEvent.currentTarget.removeEventListener("mouseover", this.autoOpenMenu, true);
  974.       this._openedMenuButton = null;
  975.     }
  976.   }
  977.  
  978. };
  979.  
  980. window.addEventListener("load", 
  981.                         function() { 
  982.                           try { 
  983.                             ybToolbar.onLoad(); 
  984.                           } catch(e) { 
  985.                             yDebug.print("Error loading Toolbar: " + e );
  986.                           }
  987.                         }, 
  988.                         false);
  989.  
  990.